#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include "achievementmanager.h"
#include "coin.h"
#include "obstacle.h"
#include "powerup.h"
#include <QAudioOutput>
#include <QElapsedTimer>
#include <QGraphicsPixmapItem>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QKeyEvent>
#include <QMainWindow>
#include <QMediaPlayer>
#include <QPushButton>
#include <QTimer>
#include <QUrl>

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

// 主游戏窗口类
class MainWindow : public QMainWindow {
    Q_OBJECT  // 启用Qt元对象系统

public:
    // 构造函数与析构函数
    explicit MainWindow(QWidget* parent = nullptr);  // 带父窗口参数的构造
    ~MainWindow();                                   // 资源释放

    // 游戏控制接口
    void startGameWithCharacter(int id);  // 根据角色ID启动游戏
    void cleanupGame();                   // 游戏资源清理

protected:
    // 事件重载
    void closeEvent(QCloseEvent* event) override;     // 窗口关闭事件处理
    void keyPressEvent(QKeyEvent* event) override;    // 键盘输入处理
    bool eventFilter(QObject* watched, QEvent* event) override;  // 事件过滤器

signals:

    void returnToMainMenu();           // 返回主菜单事件

private slots:
    // 槽函数
    void updateGame();          // 游戏主循环
    void showCharacterDialog(); // 角色选择对话框
    void ensureViewFocus();     // 确保视图焦点
    void resetSlidePosition();  // 重置背景位置

private:
    // 场景管理系统
    QGraphicsScene* scene;          // 游戏场景
    QGraphicsView* view;            // 场景显示视图
    QGraphicsPixmapItem* background;// 背景图
    QGraphicsPixmapItem* player;    // 玩家角色图

    //  游戏对象池
    QList<Obstacle*> obstacles;     // 障碍物
    QList<Coin*> coins;             // 金币
    QList<PowerUp*> powerUps;       // 道具
    QList<QGraphicsPixmapItem*> m_slideItems;  // 背景轮播图

    // 音频系统
    QMediaPlayer* m_bgmPlayer1[5];  // 多音轨背景音乐播放器
    QMediaPlayer* m_bgmPlayer;      // 开场音乐
    QMediaPlayer* m_sfxPlayer;      // 音效播放器
    QMediaPlayer* m_powerupSfx;     // 道具拾取音效
    QVector<QString> m_bgmPaths = { // 背景音乐资源路径
        "qrc:/bgm/build/喜羊羊bgm.mp3",
        "qrc:/bgm/build/海绵宝宝bgm.mp3",
        "qrc:/bgm/build/熊出没bgm.mp3",
        "qrc:/bgm/build/大耳朵图图bgm.mp3",
        "qrc:/bgm/build/蜡笔小新bgm.mp3"
    };

    // 定时器系统
    QTimer* gameTimer;        // 游戏主循环定时器
    QTimer* coinTimer;        // 金币生成定时器
    QTimer* powerupTimer;     // 道具生成定时器
    QTimer* hoverTimer;       // 悬浮状态计时器
    QTimer* focusKeeper;      // 焦点保持定时器
    QTimer* m_slideTimer;     // 背景滚动定时器
    QElapsedTimer obstacleTimer;  // 障碍生成间隔计时

    // 场景分组配置
    struct BackgroundGroup {  // 背景主题包定义
        int startIdx;         // 背景图起始索引
        int endIdx;           // 背景图结束索引
        int obstacleImg;      // 障碍物皮肤编号
        int coinImg;          // 金币皮肤编号
        BackgroundGroup(int s, int e, int o, int c)  // 构造器初始化
            : startIdx(s), endIdx(e), obstacleImg(o), coinImg(c) {}
    };

    // 背景主题配置（6组不同风格）
    QVector<BackgroundGroup> bgGroups = {
        {0, 1, 1, 1},   // 组1：背景图0-1，障碍物1，金币1
        {2, 3, 2, 2},   // 组2：背景图2-3，障碍物2，金币2
        {4, 5, 3, 3},
        {6, 7, 4, 4},
        {8, 9, 5, 5},
        {10, 11, 6, 6}
    };
    Ui::MainWindow* ui;
    QScopedPointer<AchievementManager> achievementManager;  // 成就系统智能指针


    QGraphicsTextItem* scoreText;     // 分数显示文本
    QPushButton* startBtn;            // 开始游戏按钮
    QPushButton* returnBtn = nullptr; // 返回按钮

    // 游戏参数配置
    static constexpr int VIEW_WIDTH = 1400;   // 视图宽度
    static constexpr int VIEW_HEIGHT = 700;    // 视图高度
    const int GROUND_Y = VIEW_HEIGHT - 50;    // 地面Y坐标
    const qreal HOVER_SPEED = -8.0;            // 悬浮状态移动速度
    const int maxJump = 2;                    // 最大连跳次数
    const qreal firstJumpForce = -21.6;        // 一段跳初速度
    const qreal secondJumpForce = -14.4;       // 二段跳初速度


    qreal m_baseSpeed = -3.0;         // 基础滚动速度（负值向左）
    qreal m_slideSpeed = m_baseSpeed; // 实际滚动速度（受道具影响）
    qreal m_originalSpeed;            // 速度缓存（用于状态恢复）
    qreal m_hoverYPosition;           // 悬浮模式Y轴锁定位置
    qreal velocityY = 0;              // 垂直速度（跳跃物理）

    int m_currentMusicIndex = -1;      // 当前背景音乐索引
    int obstacle_interval = 8000;     // 障碍生成间隔（ms）
    int score = 0;                    // 游戏得分
    int jumpCount = 0;                // 当前跳跃次数
    int startspeed = m_baseSpeed;     // 初始速度备份

    //  状态标志
    bool isJumping = false;           // 跳跃状态标识
    bool isGameActive = false;        // 游戏运行状态
    bool hasShield = false;            // 护盾道具状态
    bool isMagnetActive = false;      // 磁铁吸附状态
    bool isHovering = false;          // 悬浮模式状态
    bool m_isMusicPaused = false;     // 音乐暂停状态


    void setupScene();                // 场景初始化（创建视图/背景）
    void jump();                      // 跳跃物理计算
    void gameOver();                  // 游戏结束处理（弹窗/资源释放）
    void gameStart();                 // 游戏启动流程
    void generateObstacle();          // 障碍物生成（根据背景组选择皮肤）
    void generateCoin();              // 金币生成（三种排列模式）
    void generatePowerUp();           // 道具生成（随机类型）
    void updateSlides();              // 背景轮播逻辑
    void updateBackgroundMusic();     // 动态音乐切换
    void pauseAllMusic();             // 暂停所有音轨
    void forwardKeyEvent(QKeyEvent* event); // 输入事件转发
    void initializeTimers();          // 定时器初始化与连接
    void setupAudioSystem();          // 音频设备初始化
    void handlePowerUps();            // 道具效果管理
    void handlePowerUpEffect(PowerUp::Type type);  // 具体道具效果实现
    void handleHoverMovement(QKeyEvent* event);    // 悬浮模式移动处理
    const BackgroundGroup* getCurrentGroup() const;// 当前背景组获取


};

#endif // MAINWINDOW_H
